package com.nbcio.im.service;

import com.nbcio.common.core.domain.R;
import com.nbcio.system.domain.SysUser;

import java.util.List;
import java.util.Map;

/**
 * IM服务接口
 *
 * @author nbacheng
 */
public interface ImService {

    /**
     * 用户登录到IM系统
     *
     * @param user 系统用户
     * @return 登录结果
     */
    R<Map<String, Object>> loginToIm(SysUser user);

    /**
     * 用户登出IM系统
     *
     * @param userId 用户ID
     * @return 登出结果
     */
    R<Void> logoutFromIm(Long userId);

    /**
     * 同步用户到IM系统
     *
     * @param user 系统用户
     * @return 同步结果
     */
    R<Void> syncUserToIm(SysUser user);

    /**
     * 批量同步用户到IM系统
     *
     * @param users 用户列表
     * @return 同步结果
     */
    R<Void> batchSyncUsersToIm(List<SysUser> users);

    /**
     * 发送消息
     *
     * @param fromUserId 发送者ID
     * @param toUserId 接收者ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 发送结果
     */
    R<Void> sendMessage(Long fromUserId, Long toUserId, String content, String messageType);

    /**
     * 发送群组消息
     *
     * @param fromUserId 发送者ID
     * @param groupId 群组ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 发送结果
     */
    R<Void> sendGroupMessage(Long fromUserId, String groupId, String content, String messageType);


    /**
     * 获取用户IM信息
     *
     * @param userId 用户ID
     * @return IM信息
     */
    R<Map<String, Object>> getUserImInfo(Long userId);



    /**
     * 获取消息历史
     *
     * @param userId 用户ID
     * @param targetId 目标ID（用户或群组）
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 消息历史
     */
    R<Map<String, Object>> getMessageHistory(Long userId, String targetId, Integer pageNum, Integer pageSize);
    
    /**
     * 获取消息ID（用于避免前端重复）
     * @param fromUserId 发送者ID
     * @param toUserId 接收者ID
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 消息ID
     */
    String getMessageId(Long fromUserId, Long toUserId, String content, String messageType);

    // ==================== 群聊相关方法 ====================

    /**
     * 创建群聊
     * @param ownerId 群主ID
     * @param groupName 群名称
     * @param description 群描述
     * @param avatar 群头像
     * @param memberIds 初始成员ID列表
     * @return 群聊信息
     */
    R<Map<String, Object>> createGroup(Long ownerId, String groupName, String description, String avatar, List<Long> memberIds);

    /**
     * 获取用户参与的群聊列表
     * @param userId 用户ID
     * @return 群聊列表
     */
    R<List<Map<String, Object>>> getUserGroups(Long userId);

    /**
     * 获取用户会话列表
     * @param userId 用户ID
     * @return 会话列表
     */
    R<List<Map<String, Object>>> getConversationList(Long userId);

    /**
     * 标记消息为已读
     * @param userId 用户ID
     * @param toUserId 私聊对方用户ID（私聊时使用）
     * @param groupId 群聊ID（群聊时使用）
     * @return 操作结果
     */
    R<Void> markMessagesAsRead(Long userId, Long toUserId, String groupId);

    /**
     * 获取群聊详情
     * @param groupId 群ID
     * @return 群聊详情
     */
    R<Map<String, Object>> getGroupInfo(String groupId);

    /**
     * 获取群成员列表
     * @param groupId 群ID
     * @return 群成员列表
     */
    R<List<Map<String, Object>>> getGroupMembers(String groupId);

    /**
     * 添加群成员
     * @param groupId 群ID
     * @param operatorId 操作者ID
     * @param memberIds 要添加的成员ID列表
     * @return 操作结果
     */
    R<Void> addGroupMembers(String groupId, Long operatorId, List<Long> memberIds);

    /**
     * 移除群成员
     * @param groupId 群ID
     * @param operatorId 操作者ID
     * @param userId 要移除的用户ID
     * @return 操作结果
     */
    R<Void> removeGroupMember(String groupId, Long operatorId, Long userId);

    /**
     * 更新群信息
     * @param groupId 群ID
     * @param operatorId 操作者ID
     * @param groupName 群名称
     * @param description 群描述
     * @param avatar 群头像
     * @return 操作结果
     */
    R<Void> updateGroupInfo(String groupId, Long operatorId, String groupName, String description, String avatar);

    /**
     * 退出群聊
     * @param groupId 群ID
     * @param userId 用户ID
     * @return 操作结果
     */
    R<Void> quitGroup(String groupId, Long userId);

    /**
     * 解散群聊
     * @param groupId 群ID
     * @param operatorId 操作者ID
     * @return 操作结果
     */
    R<Void> disbandGroup(String groupId, Long operatorId);
}
